package com.easy.orm.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.List;

import javax.sql.DataSource;

import com.easy.orm.jdbc.support.ArrayParamsMapper;
import com.easy.orm.jdbc.support.RowMapperResultSetExtractor;

/**
 * JdbcTemplate
 * 
 * @author kun
 *
 */
public class JdbcTemplate extends JdbcOperations {

	/**
	 * <b>默认初始化实例</b>
	 */
	public JdbcTemplate() {
		super();
	}

	/**
	 * <b>事务-初始化实例</b>
	 * 
	 * @param transactionalConnection 事务连接
	 */
	public JdbcTemplate(Connection transactionalConnection) {
		super(transactionalConnection);
	}

	/**
	 * <b>带数据源-初始化实例</b>
	 * 
	 * @param dataSource 数据库连接池
	 */
	public JdbcTemplate(DataSource dataSource) {
		super(dataSource);
	}

	/**
	 * 查询结果
	 * 
	 * @param sql 查询SQL
	 * @param resultSetExtractor 结果集处理
	 * @param params 查询参数
	 * @return 结果
	 * @param <T> 返回数据类型
	 */
	public <T> T queryForObject(String sql, ResultSetExtractor<T> resultSetExtractor, Object... params) {
		return super.queryForObject(sql, params, new ArrayParamsMapper(), resultSetExtractor);
	}

	/**
	 * 查询返回list
	 * 
	 * @param sql 查询SQL
	 * @param params 参数
	 * @param paramsMapper 参数设置 Mapper
	 * @param rowMapper 行级结果处理 Mapper
	 * @return 查询结果
	 * @param <T> 返回数据类型
	 * @param <P> 参数数据类型
	 */
	public <T, P> List<T> queryForList(String sql, P params, ParamsMapper<P> paramsMapper, RowMapper<T> rowMapper) {
		return super.queryForObject(sql, params, paramsMapper, new RowMapperResultSetExtractor<>(rowMapper));
	}

	/**
	 * 查询int
	 * 
	 * @param sql 查询sql
	 * @param params 参数
	 * @param paramsMapper 参数设置
	 * @return int
	 * @param <P> 参数数据类型
	 */
	public <P> int queryForInt(String sql, P params, ParamsMapper<P> paramsMapper) {
		return super.queryForObject(sql, params, paramsMapper, (ResultSet resultSet) -> {
			int result = 0;

			// 获取第一列值
			if (resultSet != null && resultSet.next()) {
				result = resultSet.getInt(1);
			}

			return result;
		});
	}

	/**
	 * 查询返回list
	 * 
	 * @param sql 查询SQL
	 * @param rowMapper 行级结果处理mapping
	 * @param params 参数
	 * @return 查询结果
	 * @param <T> 返回数据类型
	 */
	public <T> List<T> queryForList(String sql, RowMapper<T> rowMapper, Object... params) {
		return queryForObject(sql, new RowMapperResultSetExtractor<>(rowMapper), params);
	}

	/**
	 * 查询int
	 * 
	 * @param sql 查询sql
	 * @param params 参数
	 * @return int
	 */
	public int queryForInt(String sql, Object... params) {
		return queryForInt(sql, params, new ArrayParamsMapper());
	}

	/**
	 * 修改语句
	 * 
	 * @param sql sql
	 * @param params 参数
	 * @return SQL结果
	 */
	public int update(String sql, Object... params) {
		return super.update(sql, params, new ArrayParamsMapper());
	}

	/**
	 * 批量处理
	 * 
	 * @param sql sql
	 * @param params params
	 * @return 修改结果
	 */
	public int[] batch(String sql, List<Object[]> params) {
		return super.batch(sql, params, new ArrayParamsMapper());
	}

}
